from app.utils import getPublicData
import datetime
travelInfoList = getPublicData.getAllTravelInfoMapData()
# 函数目的：该函数用于统计旅游信息中各个省份出现的次数。
def cityCharDataOne():
    # 实现逻辑：
    # 首先初始化一个空字典cityDic，用于记录每个省份及其对应的出现次数。
    cityDic = {}
    # 然后遍历travelInfoList（包含多个旅游相关信息的列表，每个元素是一个具有province属性的对象），对于每个元素，
    # 通过cityDic.get(travel.province, -1)尝试获取该省份已经记录的次数，如果获取结果为-1（表示之前未记录过该省份），
    # 则将该省份在字典中的对应值初始化为1；如果已经存在，就将对应的值加1。
    for travel in travelInfoList:
        if cityDic.get(travel.province,-1) == -1:
            cityDic[travel.province] = 1
        else:
            cityDic[travel.province] += 1
    # 最后返回省份名称的列表（通过list(cityDic.keys())获取字典的所有键）和对应出现次数的列表（通过list(cityDic.values())
    # 获取字典的所有值），方便后续可能用于绘制柱状图等展示省份分布情况的操作。
    return list(cityDic.keys()),list(cityDic.values())
# 函数目的：统计旅游信息中各个等级（可能是景点等级之类的概念）出现的频次，并将结果整理成特定的字典列表格式。
def cityCharDataTwo():
    # 实现逻辑：
    # 同样先创建空字典cityDic用于计数统计
    cityDic = {}
    # 遍历travelInfoList，根据元素中的level属性来更新字典中对应等级的出现次数，逻辑和cityCharDataOne中统计省份的类似。
    for travel in travelInfoList:
        if cityDic.get(travel.level, -1) == -1:
            cityDic[travel.level] = 1
        else:
            cityDic[travel.level] += 1
    # 之后创建一个空列表resultData
    resultData = []
    # 遍历cityDic字典的键值对，将每个键值对包装成包含'name'（对应等级）和'value'（对应出现次数）的字典，并添加到resultData列表中，

    for key,value in cityDic.items():
        resultData.append({
            'name':key,
            'value':value
        })
    # 最终返回这个格式化后的列表，这种格式可能便于前端图表库（如 Echarts 等）直接使用来展示等级分布相关图表。
    return resultData
# 函数目的：统计给定travelList中旅游项目的星级（通过star属性表示）出现的频次，并整理成适合图表展示的格式。
def getRateCharDataOne(travelList):
    #
    startDic = {}
    # 整体逻辑和前面统计等级、省份等的函数类似，先通过字典统计各星级出现的次数，再将统计结果转换为包含'name'（星级）和'value'（出现次数）
    # 的字典列表格式返回，便于后续的数据可视化等操作。
    for travel in travelList:
        if startDic.get(travel.star, -1) == -1:
            startDic[travel.star] = 1
        else:
            startDic[travel.star] += 1
    #
    resultData = []
    for key, value in startDic.items():
        resultData.append({
            'name': key,
            'value': value
        })
    return resultData

# 函数目的：统计给定travelList中旅游项目的评分（通过score属性表示）出现的频次，并整理成合适的格式用于后续展示等用途。
def getRateCharDataTwo(travelList):
    startDic = {}
    # 实现逻辑：与前面几个基于字典统计并转换格式的函数逻辑一致，先统计不同评分出现的次数存于字典，再转换为特定格式的字典列表返回。
    for travel in travelList:
        if startDic.get(travel.score, -1) == -1:
            startDic[travel.score] = 1
        else:
            startDic[travel.score] += 1
    resultData = []
    for key, value in startDic.items():
        resultData.append({
            'name': key,
            'value': value
        })
    return resultData
# 函数目的：统计给定旅游列表中不同价格区间内旅游项目的数量分布情况。
def getPriceCharDataOne(traveList):
    # 实现逻辑：
    # 首先定义了价格区间的标签列表xData，以及对应长度的初始值全为0的数量列表yData，用于记录每个价格区间内旅游项目的数量。
    xData = ['免费','100元以内','200元以内','300元以内','400元以内','500元以内','500元以外']
    yData = [0 for x in range(len(xData))]
    # 接着遍历traveList，将每个旅游项目的价格（通过travel.price获取并转换为浮点数）按照设定的价格区间条件，
    # 对应地在yData列表中相应位置的元素上加1，表示该价格区间内项目数量增加。
    for travel in traveList:
        price = float(travel.price)
        if price <= 10:
            yData[0] += 1
        elif price <= 100:
            yData[1] += 1
        elif price <= 200:
            yData[2] += 1
        elif price <= 300:
            yData[3] += 1
        elif price <= 400:
            yData[4] += 1
        elif price <= 500:
            yData[5] += 1
        elif price > 500:
            yData[6] += 1
    # 最后返回价格区间标签列表xData和对应数量列表yData，可用于绘制柱状图等展示价格分布情况。
    return xData,yData
# 函数目的：统计给定旅游列表中销售数量（通过saleCount属性表示）落在不同区间的旅游项目数量分布情况。
def getPriceCharDataTwo(traveList):
    # 实现逻辑：
    # 先创建销售数量区间标签列表xData，格式为类似"300份以内"等字符串形式，同时创建对应长度初始值全为0的数量列表yData。
    xData = [str(x * 300) + '份以内' for x in range(1,15)]
    yData = [0 for x in range(len(xData))]
    # 然后遍历traveList，获取每个旅游项目的销售数量并转换为浮点数，接着通过循环判断销售数量落在哪个区间，在对应的yData列表元素上加1，
    for travel in traveList:
        saleCount = float(travel.saleCount)
        for x in range(1,15):
            count = x * 300
            if saleCount <= count:
                yData[x - 1] += 1
                break
    # 最后返回区间标签列表和数量列表，用于展示销售数量分布相关图表。
    return xData,yData

# 函数目的：统计给定旅游列表中折扣（通过discount属性表示）出现的频次，并整理成便于展示的格式。
def getPriceCharDataThree(travelList):
    startDic = {}
    # 实现逻辑：依旧是先通过字典统计不同折扣值出现的次数，然后将统计结果转换为包含'name'（折扣值）和'value'（出现次数）
    # 的字典列表格式返回，与前面类似统计函数逻辑一致。
    for travel in travelList:
        if startDic.get(travel.discount, -1) == -1:
            startDic[travel.discount] = 1
        else:
            startDic[travel.discount] += 1
    resultData = []
    for key, value in startDic.items():
        resultData.append({
            'name': key,
            'value': value
        })
    return resultData
# 函数目的：统计评论数据中不同日期的评论数量情况，即按日期对评论进行分布统计。
def getCommentsCharDataOne():
    # 首先从getPublicData模块获取所有评论数据存于commentsList。
    commentsList = getPublicData.getAllCommentsData()
    xData = []
    # 定义了一个内部函数get_list，用于将日期字符串（格式为%Y-%m-%d）转换为时间戳，方便后续排序操作。
    def get_list(date):
        return datetime.datetime.strptime(date,'%Y-%m-%d').timestamp()
    for comment in commentsList:
        xData.append(comment['date'])
    # 先将所有评论的日期添加到xData列表，然后通过list(set(xData))去除重复的日期，
    xData = list(set(xData))
    # 接着使用sorted函数按照时间戳倒序（通过reverse=True指定）对日期列表进行排序。
    xData = list(sorted(xData,key=lambda x: get_list(x),reverse=True))
    yData = [0 for x in range(len(xData))]
    # 创建与排序后日期列表长度相同且初始值全为0的yData列表，再通过嵌套循环，根据评论日期与xData中日期的匹配情况，
    # 在对应的yData元素上加1，统计每个日期的评论数量
    for comment in commentsList:
        for index,date in enumerate(xData):
            if comment['date'] == date:
                yData[index] += 1
    # 最后返回日期列表xData和对应评论数量列表yData，可用于绘制时间序列相关的图表展示评论随时间的分布情况。
    return xData,yData
# 函数目的：统计评论数据中不同评分（通过score属性表示）出现的频次，并整理成适合展示的格式。
def getCommentsCharDataTwo():
    # 实现逻辑：与前面多个基于字典统计频次并转换格式的函数思路一致，先统计不同评分在评论数据中的出现次数存于字典，
    # 再转换为特定格式的字典列表返回，便于后续展示评论评分分布情况。
    commentsList = getPublicData.getAllCommentsData()
    startDic = {}
    for travel in commentsList:
        if startDic.get(travel['score'], -1) == -1:
            startDic[travel['score']] = 1
        else:
            startDic[travel['score']] += 1
    resultData = []
    for key, value in startDic.items():
        resultData.append({
            'name': key,
            'value': value
        })
    return resultData
# 函数目的：统计旅游信息列表中评论数量（通过commentsLen属性表示）落在不同区间的旅游项目数量分布情况。
def getCommentsCharDataThree():
    # 实现逻辑：类似getPriceCharDataTwo函数的逻辑，先定义评论数量区间标签列表xData，创建对应长度初始值全为0的数量列表yData，
    # 然后遍历旅游信息列表，根据评论数量所在区间在yData相应元素上加1
    travelList = getPublicData.getAllTravelInfoMapData()
    xData = [str(x * 1000) + '条以内' for x in range(1, 20)]
    yData = [0 for x in range(len(xData))]
    for travel in travelList:
        saleCount = int(travel.commentsLen)
        for x in range(1, 20):
            count = x * 1000
            if saleCount <= count:
                yData[x - 1] += 1
                break
    # 最后返回区间标签列表和数量列表，用于展示评论数量分布相关图表。
    return xData, yData

